namespace HZY.Framework.Repository.EntityFramework.Attributes;

/// <summary>
/// 表字段加解密
/// </summary>
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
public class TableFieldEncryptAttribute : AopMoAttribute
{
    /// <summary>
    /// 加解密算法类型
    /// </summary>
    public TableFieldEncryptAlgorithm Algorithm { get; set; } = TableFieldEncryptAlgorithm.PBEWithMD5AndDES;

    /// <inheritdoc />
    public override void OnEntry(MethodContext context)
    {
        // aop 进入...
        if (context.Method.Name.StartsWith("set_"))
        {
            return;
        }

        context.RewriteArguments = true;

        var parameters = context.Method.GetParameters();
        for (var i = 0; i < parameters.Length; i++)
        {
            if (parameters[i].ParameterType == typeof(string))
            {
                // 开始加密，并替换参数值
                context.Arguments[i] = "0000000";
            }
        }
    }

    /// <inheritdoc />
    public override void OnSuccess(MethodContext context)
    {
        // aop 成功...
        if (!context.Method.Name.StartsWith("get_"))
        {
            return;
        }

        if (context.ReturnType != typeof(string))
        {
            return;
        }

        // 开始解密，并替换返回值

        // 如果方法无返回值(void)，直接传入null即可
        context.ReplaceReturnValue(this, context.ReturnValue + " - 修改了" ?? "");
    }
}

/// <summary>
/// 表字段加解密算法
/// </summary>
public enum TableFieldEncryptAlgorithm
{
    /// <summary>
    /// 32 位 md5 算法
    /// </summary>
    MD5_32,

    /// <summary>
    /// 16 位 md5 算法
    /// </summary>
    MD5_16,

    /// <summary>
    /// 64 个字符来表示任意二进制数据算法
    /// </summary>
    BASE64,

    /// <summary>
    /// AES 对称算法 【需要模糊查询的请务必使用该算法】
    /// </summary>
    AES,

    /// <summary>
    /// 非对称加密算法
    /// </summary>
    RSA,

    /// <summary>
    /// 国密 SM2 非对称加密算法，基于 ECC
    /// </summary>
    SM2,

    /// <summary>
    /// 国密 SM3 消息摘要算法，可以用 MD5 作为对比理解
    /// </summary>
    SM3,

    /// <summary>
    /// 国密 SM4 对称加密算法，无线局域网标准的分组数据算法
    /// </summary>
    SM4,

    /// <summary>
    /// 混合算法
    /// </summary>
    PBEWithMD5AndDES,

    /// <summary>
    /// 混合算法
    /// </summary>
    PBEWithMD5AndTripleDES,

    /// <summary>
    /// 混合算法
    /// </summary>
    PBEWithHMACSHA512AndAES_256,

    /// <summary>
    /// 混合算法
    /// </summary>
    PBEWithSHA1AndDESede,

    /// <summary>
    /// 混合算法
    /// </summary>
    PBEWithSHA1AndRC2_40
}